<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/arch_hweight.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/arch_hweight.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_noref.html#_X0FTTV9YODZfSFdFSUdIVF9IXzA_"><span class="b">_ASM_X86_HWEIGHT_H</span></a>
<a name="2" /><span class="True">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X0FTTV9YODZfSFdFSUdIVF9IXzA_"><span class="b">_ASM_X86_HWEIGHT_H</span></a>
<a name="3" /><span class="True">       3:</span> 
<a name="4" /><span class="True">       4:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHXzY0QklUXzA_"><span class="b">CONFIG_64BIT</span></a>
<a name="5" /><span class="True">       5:</span> <span class="k">/* popcnt %edi, %eax -- redundant REX prefix for alignment */</span>
<a name="6" /><span class="True">       6:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_UE9QQ05UMzJfMA__"><span class="b">POPCNT32</span></a> <span class="e">&quot;.byte 0xf3,0x40,0x0f,0xb8,0xc7&quot;</span>
<a name="7" /><span class="True">       7:</span> <span class="k">/* popcnt %rdi, %rax */</span>
<a name="8" /><span class="True">       8:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_UE9QQ05UNjRfMA__"><span class="b">POPCNT64</span></a> <span class="e">&quot;.byte 0xf3,0x48,0x0f,0xb8,0xc7&quot;</span>
<a name="9" /><span class="True">       9:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_UkVHX0lOXzA_"><span class="b">REG_IN</span></a> <span class="e">&quot;D&quot;</span>
<a name="10" /><span class="True">      10:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_UkVHX09VVF8w"><span class="b">REG_OUT</span></a> <span class="e">&quot;a&quot;</span>
<a name="11" /><span class="False">      11:</span> <span class="f">#</span><span class="n">else</span>
<a name="12" /><span class="False">      12:</span> <span class="k">/* popcnt %eax, %eax */</span>
<a name="13" /><span class="False">      13:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_UE9QQ05UMzJfMA__"><span class="b">POPCNT32</span></a> <span class="e">&quot;.byte 0xf3,0x0f,0xb8,0xc0&quot;</span>
<a name="14" /><span class="False">      14:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_UkVHX0lOXzA_"><span class="b">REG_IN</span></a> <span class="e">&quot;a&quot;</span>
<a name="15" /><span class="False">      15:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_UkVHX09VVF8w"><span class="b">REG_OUT</span></a> <span class="e">&quot;a&quot;</span>
<a name="16" /><span class="True">      16:</span> <span class="f">#</span><span class="n">endif</span>
<a name="17" /><span class="True">      17:</span> 
<a name="18" /><span class="True">      18:</span> <span class="k">/*</span>
<a name="19" /><span class="True">      19:</span> <span class="k"> * __sw_hweightXX are called from within the alternatives below</span>
<a name="20" /><span class="True">      20:</span> <span class="k"> * and callee-clobbered registers need to be taken care of. See</span>
<a name="21" /><span class="True">      21:</span> <span class="k"> * ARCH_HWEIGHT_CFLAGS in &lt;arch/x86/Kconfig&gt; for the respective</span>
<a name="22" /><span class="True">      22:</span> <span class="k"> * compiler switches.</span>
<a name="23" /><span class="True">      23:</span> <span class="k"> */</span>
<a name="24" /><span class="True">      24:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">__arch_hweight32</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">w</span><span class="f">)</span>
<a name="25" /><span class="True">      25:</span> <span class="f">{</span>
<a name="26" /><span class="True">      26:</span>     <span class="m">unsigned</span> <span class="m">int</span> <span class="b">res</span> <span class="f">=</span> <span class="c">0</span><span class="f">;</span>
<a name="27" /><span class="True">      27:</span> 
<a name="28" /><span class="True">      28:</span>     <span class="m">asm</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_QUxURVJOQVRJVkVfMA__"><span class="b">ALTERNATIVE</span></a><span class="f">(</span><span class="e">&quot;call __sw_hweight32&quot;</span><span class="f">,</span> <a href="cpu.c_macros_ref.html#_UE9QQ05UMzJfMA__"><span class="b">POPCNT32</span></a><span class="f">,</span> <a href="cpu.c_macros_ref.html#_WDg2X0ZFQVRVUkVfUE9QQ05UXzA_"><span class="b">X86_FEATURE_POPCNT</span></a><span class="f">)</span>
<a name="29" /><span class="True">      29:</span>              <span class="f">:</span> <span class="e">&quot;=&quot;</span><a href="cpu.c_macros_ref.html#_UkVHX09VVF8w"><span class="b">REG_OUT</span></a> <span class="f">(</span><span class="b">res</span><span class="f">)</span>
<a name="30" /><span class="True">      30:</span>              <span class="f">:</span> <a href="cpu.c_macros_ref.html#_UkVHX0lOXzA_"><span class="b">REG_IN</span></a> <span class="f">(</span><span class="b">w</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="31" /><span class="True">      31:</span> 
<a name="32" /><span class="True">      32:</span>     <span class="m">return</span> <span class="b">res</span><span class="f">;</span>
<a name="33" /><span class="True">      33:</span> <span class="f">}</span>
<a name="34" /><span class="True">      34:</span> 
<a name="35" /><span class="True">      35:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">__arch_hweight16</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">w</span><span class="f">)</span>
<a name="36" /><span class="True">      36:</span> <span class="f">{</span>
<a name="37" /><span class="True">      37:</span>     <span class="m">return</span> <span class="b">__arch_hweight32</span><span class="f">(</span><span class="b">w</span> <span class="f">&amp;</span> <span class="c">0xffff</span><span class="f">)</span><span class="f">;</span>
<a name="38" /><span class="True">      38:</span> <span class="f">}</span>
<a name="39" /><span class="True">      39:</span> 
<a name="40" /><span class="True">      40:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">__arch_hweight8</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">w</span><span class="f">)</span>
<a name="41" /><span class="True">      41:</span> <span class="f">{</span>
<a name="42" /><span class="True">      42:</span>     <span class="m">return</span> <span class="b">__arch_hweight32</span><span class="f">(</span><span class="b">w</span> <span class="f">&amp;</span> <span class="c">0xff</span><span class="f">)</span><span class="f">;</span>
<a name="43" /><span class="True">      43:</span> <span class="f">}</span>
<a name="44" /><span class="True">      44:</span> 
<a name="45" /><span class="True">      45:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">__arch_hweight64</span><span class="f">(</span><span class="b">__u64</span> <span class="b">w</span><span class="f">)</span>
<a name="46" /><span class="True">      46:</span> <span class="f">{</span>
<a name="47" /><span class="True">      47:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">res</span> <span class="f">=</span> <span class="c">0</span><span class="f">;</span>
<a name="48" /><span class="True">      48:</span> 
<a name="49" /><span class="False">      49:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_32</span>
<a name="50" /><span class="False">      50:</span>     <span class="m">return</span>  <span class="b">__arch_hweight32</span><span class="f">(</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a><span class="f">)</span><span class="b">w</span><span class="f">)</span> <span class="f">+</span>
<a name="51" /><span class="False">      51:</span>         <span class="b">__arch_hweight32</span><span class="f">(</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a><span class="f">)</span><span class="f">(</span><span class="b">w</span> <span class="f">&gt;&gt;</span> <span class="c">32</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="52" /><span class="True">      52:</span> <span class="f">#</span><span class="n">else</span>
<a name="53" /><span class="True">      53:</span>     <span class="m">asm</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_QUxURVJOQVRJVkVfMA__"><span class="b">ALTERNATIVE</span></a><span class="f">(</span><span class="e">&quot;call __sw_hweight64&quot;</span><span class="f">,</span> <a href="cpu.c_macros_ref.html#_UE9QQ05UNjRfMA__"><span class="b">POPCNT64</span></a><span class="f">,</span> <a href="cpu.c_macros_ref.html#_WDg2X0ZFQVRVUkVfUE9QQ05UXzA_"><span class="b">X86_FEATURE_POPCNT</span></a><span class="f">)</span>
<a name="54" /><span class="True">      54:</span>              <span class="f">:</span> <span class="e">&quot;=&quot;</span><a href="cpu.c_macros_ref.html#_UkVHX09VVF8w"><span class="b">REG_OUT</span></a> <span class="f">(</span><span class="b">res</span><span class="f">)</span>
<a name="55" /><span class="True">      55:</span>              <span class="f">:</span> <a href="cpu.c_macros_ref.html#_UkVHX0lOXzA_"><span class="b">REG_IN</span></a> <span class="f">(</span><span class="b">w</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="56" /><span class="True">      56:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* CONFIG_X86_32 */</span>
<a name="57" /><span class="True">      57:</span> 
<a name="58" /><span class="True">      58:</span>     <span class="m">return</span> <span class="b">res</span><span class="f">;</span>
<a name="59" /><span class="True">      59:</span> <span class="f">}</span>
<a name="60" /><span class="True">      60:</span> 
<a name="61" /><span class="True">      61:</span> <span class="f">#</span><span class="n">endif</span>
<a name="62" /><span class="True">      62:</span> </pre>
  </body>
</html>
